home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / mus / play / tracker_3_19.lzh / tracker / solaris_audio.c < prev    next >
C/C++ Source or Header  |  1993-11-19  |  6KB  |  280 lines

  1.  
  2. /* ss10_audio.h */
  3.  
  4. /* $Id: solaris_audio.c,v 1.3 1993/11/19 14:27:06 espie Exp espie $
  5.  * $Log: solaris_audio.c,v $
  6.  * Revision 1.3  1993/11/19  14:27:06  espie
  7.  * Stupid bug.
  8.  *
  9.  * Revision 3.7  1993/01/06  17:58:39  espie
  10.  * *** empty log message ***
  11.  *
  12.  * Revision 3.6  1992/12/03  15:00:50  espie
  13.  * restore stty.
  14.  *
  15.  * Revision 3.5  1992/11/27  10:29:00  espie
  16.  * General cleanup
  17.  *
  18.  * Revision 3.4  1992/11/24  10:51:19  espie
  19.  * Sync pseudo call.
  20.  *
  21.  * Revision 3.3  1992/11/22  17:20:01  espie
  22.  * Added update_frequency call, mostly unchecked
  23.  *
  24.  * Revision 3.2  1992/11/20  14:53:32  espie
  25.  * Added finetune.
  26.  *
  27.  * Revision 3.1  1992/11/19  20:44:47  espie
  28.  * Protracker commands.
  29.  *
  30.  * Revision 3.0  1992/11/18  16:08:05  espie
  31.  * New release.
  32.  *
  33.  * Revision 1.3  1992/11/17  15:38:00  espie
  34.  * discard_buffer() call for snappier interface calls.
  35.  * - Unified support for all sparcs.
  36.  * - moved down to level 2 io.
  37.  */
  38.  
  39. #include <stdio.h>
  40. #include "defs.h"
  41. #include "extern.h"
  42. /* changed to sys/audioio from sun/audioio  DET */
  43. #include <sys/audioio.h>
  44. #include <sys/ioctl.h>
  45. #include <fcntl.h>
  46. #include <stropts.h>
  47. #include <malloc.h>
  48.  
  49. /* Ripped out a bunch of #defines   DET */
  50.      
  51. LOCAL char *id = "$Id: solaris_audio.c,v 1.3 1993/11/19 14:27:06 espie Exp espie $";
  52.  
  53. LOCAL int audio;
  54.  
  55. LOCAL struct audio_info info;
  56. LOCAL char *buffer;
  57. LOCAL short *sbuffer;
  58. LOCAL int index;
  59. LOCAL int dsize;
  60.  
  61. LOCAL int stereo;
  62. LOCAL int primary, secondary;
  63.  
  64. void set_mix(percent)
  65. int percent;
  66.     {
  67.     percent *= 256;
  68.     percent /= 100;
  69.     primary = percent;
  70.     secondary = 512 - percent;
  71.     }
  72.  
  73. #define abs(x) ((x) < 0 ? -(x) : (x))
  74.  
  75. LOCAL int available(f)
  76. int f;
  77.     {
  78.     static int possible[] = { 8000, 9600, 11025, 16000, 18900, 22050, 32000,
  79.         37800, 44100, 48000, 0};
  80.     int best = 0;
  81.     int i;
  82.  
  83.     for (i = 0; possible[i]; i++)
  84.         if (abs(possible[i] - f) < abs(best - f))
  85.             best = possible[i];
  86.     return best;
  87.     }
  88.  
  89. int open_audio(f, s)
  90. int f;
  91. int s;
  92.     {
  93.     int type;
  94. /* added DET */
  95.     audio_info_t stuff;
  96.     audio_device_t dev;
  97.  
  98. /*    audio = open("/dev/audio", O_WRONLY|O_NDELAY); */
  99. /* changed to O_WRONLY without NDELAY - overran buffer big time  DET */
  100.     audio = open("/dev/audio", O_WRONLY);
  101.     if (audio == -1)
  102.         {
  103.         fprintf(stderr, "Error: could not open audio\n");
  104.         end_all();
  105.         }
  106.     if (f == 0)
  107.         f = 22050;
  108.         /* round frequency to acceptable value */
  109.     f = available(f);
  110.  
  111. /* added DET  */
  112.     ioctl(audio, AUDIO_GETINFO, &stuff);
  113.     ioctl(audio, AUDIO_GETDEV, &dev);
  114.     if (strcmp(dev.name,"SUNW,dbri") != 0)
  115.         {
  116.         stereo = 0;
  117.         dsize = 1;
  118.         info.play.sample_rate = 8000;
  119.         info.play.encoding = AUDIO_ENCODING_ULAW;
  120.         info.play.channels = 1;
  121.         }
  122.     else
  123.         {
  124.             /* tentative set up */
  125.         AUDIO_INITINFO(&info);
  126.         info.play.sample_rate = 22050;
  127.         info.play.precision = 16;
  128.         info.play.encoding = AUDIO_ENCODING_LINEAR;
  129.         stereo = 0;
  130.         info.play.channels = 1;
  131.         dsize = 2;
  132.             /* try it */
  133.         if (ioctl(audio, AUDIO_SETINFO, &info) != 0)
  134.             /* didn't work: fatal problem */
  135.             end_all();
  136.         }
  137.     index = 0;
  138.     buffer = (char *)malloc(dsize * info.play.channels * info.play.sample_rate);
  139.     sbuffer = (short *) buffer;
  140.     if (!buffer)
  141.         end_all();
  142.     return info.play.sample_rate;
  143.     }
  144.  
  145. void set_synchro(s)
  146. BOOL s;
  147.     {
  148.     }
  149.  
  150. int update_frequency()
  151.     {
  152.     int oldfreq;
  153.  
  154.     oldfreq = info.play.sample_rate;
  155.     if (ioctl(audio, AUDIO_GETINFO, &info) == 0)
  156.         {
  157.         if (oldfreq != info.play.sample_rate)
  158.             {
  159.             buffer = realloc(buffer, 
  160.                 dsize * info.play.channels * info.play.sample_rate);
  161.             sbuffer = (short *)buffer;
  162.             return info.play.sample_rate;
  163.             }
  164.         }
  165.     return 0;
  166.     }
  167.  
  168.  
  169. LOCAL int sign(x)
  170. unsigned char x;
  171.     {
  172.     return x;
  173.     }
  174.  
  175. /************************************************************************/
  176. /*      For routine 'cvt' only                                          */
  177. /************************************************************************/
  178. /*      Copyright 1989 by Rich Gopstein and Harris Corporation          */
  179. /************************************************************************/
  180.  
  181. LOCAL unsigned int cvt(ch)
  182. int ch;
  183.     {
  184.     int mask;
  185.  
  186.     if (ch < 0)
  187.         {
  188.         ch = -ch;
  189.         mask = 0x7f;
  190.         }
  191.     else
  192.         mask = 0xff;
  193.  
  194.     if (ch < 32)
  195.         {
  196.         ch = 0xF0 | 15 - (ch / 2);
  197.         }
  198.     else if (ch < 96)
  199.         {
  200.         ch = 0xE0 | 15 - (ch - 32) / 4;
  201.         }
  202.     else if (ch < 224)
  203.         {
  204.         ch = 0xD0 | 15 - (ch - 96) / 8;
  205.         }
  206.     else if (ch < 480)
  207.         {
  208.         ch = 0xC0 | 15 - (ch - 224) / 16;
  209.         }
  210.     else if (ch < 992)
  211.         {
  212.         ch = 0xB0 | 15 - (ch - 480) / 32;
  213.         }
  214.     else if (ch < 2016)
  215.         {
  216.         ch = 0xA0 | 15 - (ch - 992) / 64;
  217.         }
  218.     else if (ch < 4064)
  219.         {
  220.         ch = 0x90 | 15 - (ch - 2016) / 128;
  221.         }
  222.     else if (ch < 8160)
  223.         {
  224.         ch = 0x80 | 15 - (ch - 4064) /  256;
  225.         }
  226.     else
  227.         {
  228.         ch = 0x80;
  229.         }
  230.     return (mask & ch);
  231.     }
  232.  
  233.  
  234. void output_samples(left, right)
  235. int left, right;
  236.     {
  237.     if (stereo)
  238.         {
  239.         sbuffer[index++] = (left * primary + right * secondary)/256;
  240.         sbuffer[index++] = (right * primary + left * secondary)/256;
  241.         }
  242.     else
  243.         switch(info.play.encoding)
  244.             {
  245.         case AUDIO_ENCODING_LINEAR:
  246.             sbuffer[index++] = left + right;
  247.             break;
  248.         case AUDIO_ENCODING_ULAW:
  249.             buffer[index++] = cvt((left + right) /16);
  250.             break;
  251.             }
  252.     }
  253.  
  254. void flush_buffer()
  255.     {
  256. /* added DET */
  257.     int bubba;
  258.     bubba = write(audio, buffer, dsize * index);
  259.  
  260. /* added DET */
  261.     if (bubba == -1)
  262.         perror("write to audio:");
  263.     else if (bubba != dsize*index)
  264.         printf("Short write of %d bytes\n", bubba);
  265.     index = 0;
  266.     }
  267.  
  268. void discard_buffer()
  269.     {
  270.     ioctl(audio, I_FLUSH, FLUSHW);
  271.     }
  272.  
  273. void close_audio()
  274.     {
  275.     free(buffer);
  276.     close(audio);
  277.     }
  278.  
  279.  
  280.